Попробуем реализовать методы из https://www.researchgate.net/publication/221451749_Linear_Reformulations_of_Integer_Quadratic_Programs/
11
Упражнения
Найти кое-что пропущеное в постановке
get_model_bbl
(мелочь, так, на внимательность)
Разобраться в ограничениях BBL
Написать комментарии зачем они.
Можно уменьшить их число?
Сделать отдельно линеаризацию BIL
т.е. написать функцию get_model_bil
«binary integer linerization» из статьи
А что с библиотеками для решения квадратичного программирования?
Простой пример с CVXPY
Не Pyomo, но схожий язык.
Оптимизационные переменные
Ограничения
Целевая функция
Решаем
---------------------------------------------------------------------------
DCPError Traceback (most recent call last)
/var/data/cocalc/1d588dae-0d14-422a-88b4-c470ec2c8303/hard-problems-formulations/maximum-quadratic-programming.ipynb Cell 24 line 8
<a href='vscode-notebook-cell://xn--17-6kce2c.xn--80apqgfe.xn--p1ai/var/data/cocalc/1d588dae-0d14-422a-88b4-c470ec2c8303/hard-problems-formulations/maximum-quadratic-programming.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=5'>6</a> # prob = cp.Problem(cp.Minimize(obj), constraits)
<a href='vscode-notebook-cell://xn--17-6kce2c.xn--80apqgfe.xn--p1ai/var/data/cocalc/1d588dae-0d14-422a-88b4-c470ec2c8303/hard-problems-formulations/maximum-quadratic-programming.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=6'>7</a> print(prob)
----> <a href='vscode-notebook-cell://xn--17-6kce2c.xn--80apqgfe.xn--p1ai/var/data/cocalc/1d588dae-0d14-422a-88b4-c470ec2c8303/hard-problems-formulations/maximum-quadratic-programming.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=7'>8</a> prob.solve() #solver=cp.SCIP
File ~/hard-problems-formulations/.venv/lib64/python3.11/site-packages/cvxpy/problems/problem.py:503, in Problem.solve(self, *args, **kwargs)
501 else:
502 solve_func = Problem._solve
--> 503 return solve_func(self, *args, **kwargs)
File ~/hard-problems-formulations/.venv/lib64/python3.11/site-packages/cvxpy/problems/problem.py:1072, in Problem._solve(self, solver, warm_start, verbose, gp, qcp, requires_grad, enforce_dpp, ignore_dpp, canon_backend, **kwargs)
1069 self.unpack(chain.retrieve(soln))
1070 return self.value
-> 1072 data, solving_chain, inverse_data = self.get_problem_data(
1073 solver, gp, enforce_dpp, ignore_dpp, verbose, canon_backend, kwargs
1074 )
1076 if verbose:
1077 print(_NUM_SOLVER_STR)
File ~/hard-problems-formulations/.venv/lib64/python3.11/site-packages/cvxpy/problems/problem.py:646, in Problem.get_problem_data(self, solver, gp, enforce_dpp, ignore_dpp, verbose, canon_backend, solver_opts)
644 if key != self._cache.key:
645 self._cache.invalidate()
--> 646 solving_chain = self._construct_chain(
647 solver=solver, gp=gp,
648 enforce_dpp=enforce_dpp,
649 ignore_dpp=ignore_dpp,
650 canon_backend=canon_backend,
651 solver_opts=solver_opts)
652 self._cache.key = key
653 self._cache.solving_chain = solving_chain
File ~/hard-problems-formulations/.venv/lib64/python3.11/site-packages/cvxpy/problems/problem.py:898, in Problem._construct_chain(self, solver, gp, enforce_dpp, ignore_dpp, canon_backend, solver_opts)
896 candidate_solvers = self._find_candidate_solvers(solver=solver, gp=gp)
897 self._sort_candidate_solvers(candidate_solvers)
--> 898 return construct_solving_chain(self, candidate_solvers, gp=gp,
899 enforce_dpp=enforce_dpp,
900 ignore_dpp=ignore_dpp,
901 canon_backend=canon_backend,
902 solver_opts=solver_opts,
903 specified_solver=solver)
File ~/hard-problems-formulations/.venv/lib64/python3.11/site-packages/cvxpy/reductions/solvers/solving_chain.py:217, in construct_solving_chain(problem, candidates, gp, enforce_dpp, ignore_dpp, canon_backend, solver_opts, specified_solver)
215 if len(problem.variables()) == 0:
216 return SolvingChain(reductions=[ConstantSolver()])
--> 217 reductions = _reductions_for_problem_class(problem, candidates, gp, solver_opts)
219 # Process DPP status of the problem.
220 dpp_context = 'dcp' if not gp else 'dgp'
File ~/hard-problems-formulations/.venv/lib64/python3.11/site-packages/cvxpy/reductions/solvers/solving_chain.py:132, in _reductions_for_problem_class(problem, candidates, gp, solver_opts)
129 elif problem.is_dqcp():
130 append += ("\nHowever, the problem does follow DQCP rules. "
131 "Consider calling solve() with `qcp=True`.")
--> 132 raise DCPError(
133 "Problem does not follow DCP rules. Specifically:\n" + append)
134 elif gp and not problem.is_dgp():
135 append = build_non_disciplined_error_msg(problem, 'DGP')
DCPError: Problem does not follow DCP rules. Specifically:
The objective is not DCP. Its following subexpressions are not:
QuadForm(var45, [[0.00 1.00]
[1.00 0.00]])
Визуализируем эту матрицу
Увы, библиотеки работают с выпуклыми-коническими функциями и ограничениями.
Упражнения
Сделать генерацию данных подходящих для решения библиотеками cvxpy, cvxopt, picos (коническое-выпуклое) и прорешать и этими библиотеками, и через линеаризацию, сравнить, возможно найти ошибки. (достаточно добавить еще одну библиотеку, не обязательно перебирать все, или даже для имеющихся cvxpy это проделать)
Кстати, pyomo тоже умеет в квадратичное программирование, см. например 1, но не факт что со всеми солверами — тоже надо потестировать.